﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;

namespace Billing
{
    public static class Guard
    {
        /// <summary>
        /// სტრიქონის ცარიელობის ან ნულოვნობის შემოწმების მეთოდი
        /// </summary>
        /// <param name="argumentValue">შესამოწმებელი არგუმენტი.</param>
        /// <param name="argumentName">არგუმენტის სახელი.</param>
        /// <exception cref="ArgumentException">თუ სტრიქონი ნულოვანი ან ცარიელია.</exception>
        public static void ArgumentNotNullOrEmptyString(string argumentValue, string argumentName)
        {
            ArgumentNotNull(argumentValue, argumentName);

            if (argumentValue.Length == 0)
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, "ცარიელი სტრიქონი არ შეიძლება {0}", argumentName));
        }

        /// <summary>
        /// ამოწმებს არგუმენტის ნულოვნობას
        /// 
        /// </summary>
        /// <param name="argumentValue">შესამოწმებელი არგუმენტი.</param>
        /// <param name="argumentName">არგუმენტის სახელი.</param>
        /// <exception cref="ArgumentException">თუ არგუმენტი ნულოვანია.</exception>
        public static void ArgumentNotNull(object argumentValue, string argumentName)
        {
            if (argumentValue == null)
                throw new ArgumentNullException(argumentName);
        }

        public static void ReturnValueIsNotNull(object argumentValue, string argumentName)
        {
            if (argumentValue == null)
                throw new InvalidOperationException(string.Format("Return Value cannot be null parameter: {0}", argumentName));
        }
        /// <summary>
        /// ამოწმებს Enum არგუმენტს, რათა დადასტურდეს მნიშვნელობის მის ჩამონათვალში არსებობა.
        /// </summary>
        /// <param name="enumType">Enum ტიპის მიშვნელობა.</param>
        /// <param name="value">არგუმენტი, რომელიც უნდა არსებობდეს Enum ტიპში.</param>
        /// <param name="argumentName">არგუმენტის სახელი.</param>
        public static void EnumValueIsDefined(Type enumType, object value, string argumentName)
        {
            if (Enum.IsDefined(enumType, value) == false)
                throw new ArgumentException(String.Format(CultureInfo.CurrentCulture,
                    "{0} არ არსებობს {1} ჩამონათვალში",
                    argumentName, enumType.ToString()));
        }

        /// <summary>
        /// Verifies that an argument type is assignable from the provided type (meaning
        /// interfaces are implemented, or classes exist in the base class hierarchy).
        /// </summary>
        /// <param name="assignee">The argument type.</param>
        /// <param name="providedType">The type it must be assignable from.</param>
        /// <param name="argumentName">The argument name.</param>
        public static void TypeIsAssignableFromType(Type assignee, Type providedType, string argumentName)
        {
            if (!providedType.IsAssignableFrom(assignee))
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
                    " {0} ტიპი შეუთავსებელია {1} ტიპისთვის", assignee, providedType), argumentName);
        }

        /// <summary>
        /// მასივის ნულოვნობის ან ცარიელობის შემოწმების მეთოდი.
        /// </summary>
        /// <param name="array">შესამოწმებელი მასივი.</param>
        /// <param name="argumentName">არგუმენტის სახელი.</param>
        public static void ArrayIsNotNullOrEmpty(object[] array, string argumentName)
        {
            ArgumentNotNull(array, "array");
            if (array.Length == 0)
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
                    "{0} მასივის ელემენტების რაოდენობა მინიმუმ ერთი უნდა იყოს - {1}", argumentName, array), argumentName);
        }
    }
}
